#include <vector>
#include <string>
#include <iostream>

// 抽象迭代器
class Iterator {
public:
    virtual ~Iterator() {}
    virtual void first() = 0; 						// 将迭代器移动到第一个元素
    virtual void next() = 0;  						// 移动到下一个元素
    virtual bool isDone() const = 0; 				// 检查迭代器是否已经遍历完所有元素
    virtual std::string currentItem() const = 0; 	// 获取当前元素
};

// 具体迭代器实现
class BookIterator : public Iterator {
private:
    const std::vector<std::string>& books; 			// 图书集合的引用
    size_t current; 								// 当前元素的索引

public:
    BookIterator(const std::vector<std::string>& books) : books(books), current(0) {}

    void first() override {
        current = 0;
    }

    void next() override {
        if (!isDone()) {
            current++;
        }
    }

    bool isDone() const override {
        return current >= books.size();
    }

    std::string currentItem() const override {
        if (isDone()) {
            throw std::out_of_range("Iterator out of range");
        }
        return books[current];
    }
};

// 抽象聚合类
class Aggregate {
public:
    virtual ~Aggregate() {}
    virtual Iterator* createIterator() const = 0; 		// 创建迭代器的抽象方法
};

// 具体聚合实现
class BookCollection : public Aggregate {
private:
    std::vector<std::string> books; 					// 存储图书的容器

public:
    void addBook(const std::string& book) { 			// 添加图书到集合
        books.push_back(book);
    }

    Iterator* createIterator() const override { 		// 实现创建迭代器的方法
        return new BookIterator(books);
    }
};

// 主函数，演示迭代器的使用
int main() {
    BookCollection collection;
    collection.addBook("Design Patterns");
    collection.addBook("Design C++");

    Iterator* it = collection.createIterator();
    for (it->first(); !it->isDone(); it->next()) {
        std::cout << it->currentItem() << std::endl;
    }
    delete it; 									// 不要忘记释放迭代器
    return 0;
}